package com.shujia

import java.io.{BufferedReader, FileReader, FileWriter, PrintWriter}
import java.sql.{Connection, DriverManager, PreparedStatement, ResultSet, Statement}
import scala.io.{BufferedSource, Source}

object Demo5ScalaBase {
  /**
   * 基本语法
   */
  def main(args: Array[String]): Unit = {
    /**
     * 变量
     * 可以用val 和 var修饰，定义的时候不需要指定类型
     * 用val修饰的变量 不能进行修改 相当于常量
     * 用var修饰的变量 可以进行修改
     * 能使用val就用val
     */
    val i = 100
    var j = 200

    println(i + 1) // 不算是修改
    //    i = 101 // 这是修改 会直接报错

    println(i)
    println(j)

    j = 300
    print(j)

    /**
     * 类型推断
     */

    // 自动推断
    val k = 100
    // 手动加上类型 √
    val k1: Int = 100
    // 多态 ： 父类引用指向子类对象
    val k2: Object = "100"

    println(k)
    println(k1)
    println(k2)

    /**
     * 类型转换
     * 只要数据符合要求就可以直接to+类型
     *
     */
    // Java中的类型转换
    // Scala中的String就是Java中的String
    val str1: String = "123"
    println(Integer.parseInt(str1))

    // Scala 中的类型转换
    // 隐式转换 动态增加方法
    val i1: Int = str1.toInt
    println(i1)


    /**
     * String 类型
     */

    val str: String = "hello,world"
    println(str.split(","))

    /**
     * 字符串拼接
     */

    val str2: String = "abc" + "efg"
    println(str2)

    val builder: StringBuilder = new StringBuilder()
    builder.append("a")
    builder.append("bc")
    builder.append("ef")
    println(builder)

    val str3 = "abc"
    val str4 = "efg"
    val i3 = 10
    // Scala中的拼接方式
    // 可以通过 $变量名 在字符串中取变量的值 底层也是StringBuilder
    println(s"$str3,$str4,$i3")

    println("=" * 50)
    println("=".*(50))
    print(100 * 10)

    /**
     * 文件读写
     */
    // Java的方式
    val reader: FileReader = new FileReader("scala/data/students.txt")
    val br = new BufferedReader(reader)
    var line = br.readLine()
    while (line != null) {
      println(line)
      line = br.readLine()
    }
    br.close()
    println("*" * 50)

    // Scala读文件
    val source: BufferedSource = Source.fromFile("scala/data/students.txt")

    // 返回一个迭代器
    // 迭代器只能遍历一次
    val iter: Iterator[String] = source.getLines()

    // scala中的for each
    for (elem <- iter) {
      println(elem)
    }
    println("*" * 50)
    for (elem <- iter) {
      println(elem)
    }

    // 第一种简化
    for (elem <- Source
      .fromFile("scala/data/students.txt")
      .getLines()) {
      println(elem)
    }
    println("*" * 50)
    // 第二种简化
    // 链式调用
    Source
      .fromFile("scala/data/students.txt")
      .getLines()
      .foreach(println)

    println("*" * 50)

    /**
     * 写文件PrintWriter、FileWriter
     * 都是Java中的类
     * Scala中没有特定的类
     */

    /**
     * JDBC
     */

    // 1、加载驱动
    Class.forName("com.mysql.jdbc.Driver")
    // 2、创建连接
    val conn: Connection = DriverManager.getConnection("jdbc:mysql://master:3306/student", "root", "123456")
    // 3、创建Statement
    val stat: PreparedStatement = conn.prepareStatement("select * from student where clazz = ?")
    stat.setString(1, "文科二班")
    val rs: ResultSet = stat.executeQuery()
    while (rs.next()) {
      val _name: String = rs.getString("name")
      val gender: String = rs.getString("gender")
      println(s"${_name},$gender")
    }
    conn.close()


  }

}
